package com.fx.dao;

import com.fx.utils.JdbcUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

/**
 * @author 奉先
 * @date 2021年8月18日15:58:36
 *
 * 此类为抽象类，给其他类复用代码
 */
public abstract class BaseDao {

    //使用DbUtils操作数据库
    private QueryRunner queryRunner=new QueryRunner();

    /**
     * update()用来执行insert\Update\Delete语句
     * @return 如果返回-1，说明执行失败<br/>其他便是返回受影响的行数
     */
    public int update(String sql,Object ... args){
        Connection conn= JdbcUtils.getConnection();
        try {
            return queryRunner.update(conn,sql,args);//正常返回查询结果，受影响的行数
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.close(conn);
        }
//        conn.rollback();//异常，回滚
        return -1;//异常返回-1
    }

    /**
     * 查询返回一个javaBean的SQL语句
     * @param type  返回的对象类型
     * @param sql   执行的SQL语句
     * @param args  可变长参数
     * @param <T>   返回的类型的泛型
     * @return      返回null表示查询失败<br/>返回其他表示查询成功
     */
    public <T> T queryForone(Class<T> type, String sql,Object ... args){
        Connection conn= JdbcUtils.getConnection();
        try {
            return queryRunner.query(conn,sql,new BeanHandler<T>(type),args);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.close(conn);
        }
        return null;
    }

    /**
     * 查询返回多个javaBean的SQL语句
     * @param type  返回的对象类型
     * @param sql   执行的SQL语句
     * @param <T>   返回的类型的泛型
     * @return      返回null表示查询失败<br/>返回其他表示查询成功
     */
    public <T> List<T> queryForList(Class<T> type, String sql){
        Connection conn= JdbcUtils.getConnection();
        try {
            return queryRunner.query(conn,sql,new BeanListHandler<T>(type));
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.close(conn);
        }
        return null;
    }

    /**
     * 执行返回一行一列的SQL语句，用于做统计查询
     * @param sql   执行的SQL语句
     * @param args  SQL语句里的参数
     * @return      返回null表示异常<br/>返回其他表示查询成功
     */
    public Object queryForSingleValue(String sql, Object ... args){
        Connection conn= JdbcUtils.getConnection();
        try {
            return queryRunner.query(conn,sql,new ScalarHandler(),args);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.close(conn);
        }
        return null;
    }

}
